<?php
/**
 * Clase que realiza las operaciones CRUD (Create, Read, Update, Delete) en la base de datos portatil.
 */
class TransclusionDAO{
    // Singleton
	private static $instance;

	// Url de la base de datos y matriz de los elementos ya cargados
    private $trDBUrl;
    private $trMatrix;

    // A private constructor; prevents direct creation of object
    private function __construct() {
/*
		global $IP;
    		$this->trDBUrl = "$IP/extensions/MediaWikiExtension/includefiles/transclusiondb.db";
*/
		$this->trDBUrl = "transclusiondb.db";
    }

    // M�todo Singleton
    public static function singleton() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }

    /**
     * M�todo de inicializaci�n de la Base de Datos
     *	- Si la base de datos no existe, la crea
     *	- En caso contrario, la deja intacta
     * @author: Jaime Penagos
     */
	public function setupTransclusionDB() {
		// Se borra el archivo de base de datos que exista, para crear uno nuevo
		$bdExiste = file_exists( $this->trDBUrl );

		// Si la base de datos no existe, crearla.
		if ( !$bdExiste ) {
			// Se crea la base de datos
			$trDB = new SQLite3( $this->trDBUrl );

			// Si la base de datos fue creada sin problema
			if ( $trDB != false ) {
				$trDB -> query( "CREATE TABLE trtable (
					trid CHAR(5) NOT NULL,
                         sourceurl TEXT NOT NULL,
					targeturl TEXT NOT NULL,
                         sectionid INT NOT NULL,
					trtext TEXT NULL
				);" );

				$trDB -> query ("CREATE UNIQUE INDEX trDBUrl.primarykey ON trtable (trid, sourceurl, targeturl);");

				// TODO: Eliminar estas lineas
				// Lineas opcionales. Se eliminaran luego.
				//$trDB -> query( "INSERT INTO trtable VALUES ('a1b1c1','Pagina2','');" );
				//$trDB -> query( "INSERT INTO trtable VALUES ('d2e2f2','Pagina3','');" );

				$trDB -> close();
			}
		}
		else {
			// Si la base de datos existe, se deja quieta
		}
		$this->loadValues();
	}

	/**
	 * M�todo que carga los valores de translcusi�n de la base de datos a una matriz local
	 * @author: Jaime Penagos
	 */
	private function loadValues(){
		$trDB = new SQLite3( $this->trDBUrl );

		$results = $trDB -> query ( "SELECT * FROM trtable;" );

		// Se cargan los valores de la base de datos a la matriz
		$i = 0;
		while($res = $results->fetchArray(SQLITE3_ASSOC)){
			$this -> trMatrix[$i]['trid'] = $res['trid'];
			$this -> trMatrix[$i]['targeturl'] = $res['targeturl'];
			$this -> trMatrix[$i]['sourceurl'] = $res['sourceurl'];
			$this -> trMatrix[$i]['trtext'] = $res['trtext'];

			$i++;
		}
		$trDB -> close();
	}

	/**
	 * M�todo GET para la matriz de elementos de transclusiones
	 * @author: Jaime Penagos
	 */
	public function getTransclusionMatrix(){
		return $this -> trMatrix;
	}

	/**
	 * M�todo que actualiza el nuevo texto de la transclusi�n editada
	 * @param $id: id de la transclusi�n
	 * @param $text: texto a guardar
	 */
	public function saveText( $id , $text ){
		$trDB = new SQLite3( $this->trDBUrl );

		$proccessedText = htmlspecialchars ( $text , ENT_QUOTES );

		$trDB -> query( "UPDATE trtable
			SET trtext = '" . $proccessedText . "'
			WHERE trid = '" . $id . "'
			;" );

		$trDB -> close();
	}

	// TODO: Revisar o borrar estas l�neas
//	public function getUrl(){
//		return $this -> trDBUrl;
//	}
//
//	public function setUrl($url){
//		$this -> trDBUrl = $url;
//	}

	/**
	 * M�todo que
	 * @param $trid: id de la transclusi�n
	 * @return el elemento cargado de la base de datos con id $trid
	 * @return false si no encuentra el id en la base de datos
	 */
	public function loadTag( $trid ){
		$i = 0;

		$nroElementos = count($this -> trMatrix);

		$indice = $i;

		$resultado = false;

		while ( $i < $nroElementos ){
			if( $this -> trMatrix[ $i ][ 'trid' ] == $trid){
				$indice = $i;
				$resultado = true;
			}
			$i++;
		}

		if( $resultado ){
			return $this -> trMatrix[ $indice ];
		}
		else{
			return false;
		}
	}

	public function registerTransclusion($trid, $source, $target, $sectionId, $trtext){
		$trDB = new SQLite3( $this->trDBUrl );

		// Si la base de datos fue creada sin problema
		if ( $trDB != false ) {
			$trDB -> query( "INSERT INTO trtable VALUES('$trid', '$source', '$target', '$sectionId', '$trtext');");

			$trDB -> close();
		}
	}
}
?>